package com.mkk.library.utils

import java.text.SimpleDateFormat
import java.util.*
import java.util.regex.Pattern

object VerifyUtils {
    /**
     * 身份证验证
     * @param idStr
     * @return
     */
    fun IdentityCardVerification(idStr: String): String? {
        val wf = arrayOf("1", "0", "x", "9", "8", "7", "6", "5", "4", "3", "2")
        val checkCode = arrayOf(  "7","9","10","5","8","4","2","1","6","3","7","9","10","5","8","4","2")
        var iDCardNo = ""
        try {
            //判断号码的长度 15位或18位
            if (idStr.length != 15 && idStr.length != 18) {
                return "身份证号码长度应该为15位或18位"
            }
            if (idStr.length == 18) {
                iDCardNo = idStr.substring(0, 17)
            } else if (idStr.length == 15) {
                iDCardNo = idStr.substring(0, 6) + "19" + idStr.substring(6, 15)
            }
            if (isStrNum(iDCardNo) == false) {
                return "身份证15位号码都应为数字;18位号码除最后一位外,都应为数字"
            }
            //判断出生年月
            val strYear: String = iDCardNo.substring(6, 10) // 年份
            val strMonth: String = iDCardNo.substring(10, 12) // 月份
            val strDay: String = iDCardNo.substring(12, 14) // 月份
            if (isStrDate("$strYear-$strMonth-$strDay") == false) {
                return "身份证生日无效"
            }
            val gc = GregorianCalendar()
            val s = SimpleDateFormat("yyyy-MM-dd")
            if (gc[Calendar.YEAR] - strYear.toInt() > 150 || gc.time.time - s.parse("$strYear-$strMonth-$strDay").time < 0) {
                return "身份证生日不在有效范围"
            }
            if (strMonth.toInt() > 12 || strMonth.toInt() == 0) {
                return "身份证月份无效"
            }
            if (strDay.toInt() > 31 || strDay.toInt() == 0) {
                return "身份证日期无效"
            }
            //判断地区码
            val h = GetAreaCode()
            if (h!![iDCardNo.substring(0, 2)]== null) {
                return "身份证地区编码错误"
            }
            //判断最后一位
            var theLastOne = 0
            for (i in 0..16) {
                theLastOne = theLastOne + iDCardNo[i].toString().toInt() * checkCode[i].toInt()
            }
            val modValue = theLastOne % 11
            val strVerifyCode = wf[modValue]
            iDCardNo = iDCardNo + strVerifyCode
            if (idStr.length == 18 && iDCardNo != idStr) {
                return "身份证无效，不是合法的身份证号码"
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return ""
    }

    /**
     * 地区代码
     * @return Hashtable
     */
    private fun GetAreaCode(): Hashtable<*, *>? {
        val hashtable: Hashtable<String, String> = Hashtable<String,String>()
        hashtable.put("11","北京")
        hashtable["11"] = "北京"
        hashtable["12"] = "天津"
        hashtable["13"] = "河北"
        hashtable["14"] = "山西"
        hashtable["15"] = "内蒙古"
        hashtable["21"] = "辽宁"
        hashtable["22"] = "吉林"
        hashtable["23"] = "黑龙江"
        hashtable["31"] = "上海"
        hashtable["32"] = "江苏"
        hashtable["33"] = "浙江"
        hashtable["34"] = "安徽"
        hashtable["35"] = "福建"
        hashtable["36"] = "江西"
        hashtable["37"] = "山东"
        hashtable["41"] = "河南"
        hashtable["42"] = "湖北"
        hashtable["43"] = "湖南"
        hashtable["44"] = "广东"
        hashtable["45"] = "广西"
        hashtable["46"] = "海南"
        hashtable["50"] = "重庆"
        hashtable["51"] = "四川"
        hashtable["52"] = "贵州"
        hashtable["53"] = "云南"
        hashtable["54"] = "西藏"
        hashtable["61"] = "陕西"
        hashtable["62"] = "甘肃"
        hashtable["63"] = "青海"
        hashtable["64"] = "宁夏"
        hashtable["65"] = "新疆"
        hashtable["71"] = "台湾"
        hashtable["81"] = "香港"
        hashtable["82"] = "澳门"
        hashtable["91"] = "国外"
        return hashtable
    }

    /**
     * 判断字符串是否为数字
     * @param str
     * @return
     */
    private fun isStrNum(str: String): Boolean {
        val pattern = Pattern.compile("[0-9]*")
        val isNum = pattern.matcher(str)
        return if (isNum.matches()) {
            true
        } else {
            false
        }
    }

    /**
     * 判断字符串是否为日期格式
     * @param strDate
     * @return
     */
    fun isStrDate(strDate: String?): Boolean {
        val pattern =
            Pattern.compile("^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$")
        val m = pattern.matcher(strDate)
        return if (m.matches()) {
            true
        } else {
            false
        }
    }

}